оператор if
===========

.. index::
    if

Мы узнали, что фактическая работа в программе выполняется выражениями. Все
выражения всех программ, которые мы видели до сих пор, начинались с
функции main() и выполнялись до конца этой функции .
Операторы, с другой стороны, являются функциями, которые влияют на выполнение
выражений. Операторы сами по себе не генерируют значения и не имеют побочных эффектов

* Они определяют, выполняются ли выражения и в каком порядке
* Операторы иногда используют логические выражения при принятии таких решений.

*Примечание: Другие языки программирования могут иметь разные определения для выражения
и инструкции, в то время как некоторые другие могут вообще не иметь различий.*

Блок if и его область видимости
-------------------------------

Оператор if определяет, будет ли выполнено одно или несколько выражений.
Он принимает это решение путем вычисления логического выражения. Оно имеет то
же значение, что и английское слово "if", как во фразе "если есть кофе, то я выпью кофе".

if принимает логическое выражение в круглых скобках. Если значение этого логического
выражения равно true , то оно выполняет выражения, которые находятся в пределах за оператором
блока кода, заключенного  фигурные скобки. И наоборот, если логическое выражение равно false, оно не выполняет
выражения, заключенные в фигурные скобки.

Вот синтаксис оператора if:

.. code-block:: d

    if (a_logical_expression)
    {
    // ... выражения для выполнения, если true
    }

Например, программная конструкция, представляющая "если есть кофе, то выпейте
кофе и вымойте чашку", может быть записана как в следующей программе:

.. code-block:: d

    import std.stdio;

    void main()
    {
        bool existsCoffee = true;
        if (existsCoffee)
        {
            writeln("Drink coffee");
            writeln("Wash the cup");
        }
    }



Если значение existsCoffee равно false , то выражения, которые находятся внутри
блока, будут пропущены, и программа ничего не напечатает.

Блок else и его область видимости
---------------------------------

.. index::
    else

Иногда существуют операции, которые необходимо выполнить, когда логическое выражение оператора
if равно false . Например, всегда есть операция для выполнения в
решении типа "если есть кофе, я буду пить кофе, в противном случае я буду пить чай".
Операции для выполнения в случае false помещаются в область видимости после ключевого слова else:

.. code-block:: d

    if (a_logical_expression)
    {
    // ... выражение(ы) для выполнения, если оно истинно
    } else {
    // ... выражения для выполнения, если false
    }

Например, в предположении, что всегда есть чай:

.. code-block:: d

    if (existsCoffee)
    {
        writeln("Drink coffee");
    }
    else
    {
        writeln("Drink tea");
    }


В этом примере будет напечатана либо первая, либо вторая строка в зависимости от значения existsCoffee .
else сам по себе является не оператором, а необязательным предложением оператора if; его нельзя использовать отдельно.
Обратите внимание на размещение фигурных скобок в блоках if и else выше. Хотя
официальным стилем D является размещение фигурных скобок на отдельных строках, в этой книге повсеместно используется
общий стиль встроенных фигурных скобок.

Всегда используйте фигурные скобки scope
----------------------------------------

Не рекомендуется, но на самом деле возможно опускать фигурные скобки, если в
области видимости есть только один оператор. Поскольку как в области if, так и в области else есть только
один оператор выше, этот код также может быть записан следующим образом:

.. code-block:: d

    if (existsCoffee)
        writeln("Drink coffee");
    else
        writeln("Drink tea");

Большинство опытных программистов используют фигурные скобки даже для отдельных операторов.
(Одно из упражнений этой главы посвящено их пропуску.) Сказав это, я
сейчас покажу единственный случай, когда пропуск фигурных скобок на самом деле лучше.

Цепочка "if, else if, else"
---------------------------


Одной из возможностей операторов и выражений является возможность использовать их
более сложными способами. В дополнение к выражениям области могут содержать другие
операторы. Например, область else может содержать оператор if. Соединение
операторов и выражений различными способами позволяет нам заставить программы вести
себя разумно в соответствии с их целями.
Ниже приведен более сложный пример, написанный в соответствии с соглашением о том, что
поездка в хорошую кофейню предпочтительнее, чем прогулка в плохую:

.. code-block:: d

    if (existsCoffee)
    {
        writeln("Drink coffee at home");
    }
    else
    {
        if (existsBicycle)
        {
            writeln("Ride to the good place");
        }
        else
        {
            writeln("Walk to the bad place");
        }
    }



Приведенный выше код представляет предложения "Если есть кофе, пейте дома. В противном случае, если
есть велосипед, поезжайте в хорошее место. В противном случае идите пешком в плохое место".
Давайте еще больше усложним процесс принятия решения: вместо того, чтобы идти пешком в
плохое место, давайте сначала попробуем выпить кофе у соседа:

.. code-block:: d

    if (existsCoffee)
    {
        writeln("Drink coffee at home");
    }
    else
    {
        if (existsBicycle)
        {
            writeln("Ride to the good place");
        }
        else
        {
            if (neighborIsHome)
            {
                writeln("Have coffee at neighbor's");
            }
            else
            {
                writeln("Walk to the bad place");
            }
        }
    }



Такие решения, как "если этот случай, иначе, если тот другой случай, иначе, если тот еще другой случай
и т.д.", распространены в программах. К сожалению, когда упрямо соблюдается правило всегда использовать
фигурные скобки, в коде в конечном итоге получается слишком много
горизонтальный и вертикальный пробел: игнорируя пустые строки, 3 оператора if и
4 выражения writeln, приведенные выше, занимают в общей сложности 13 строк.
Чтобы написать такие конструкции более компактным способом, когда область else
содержит только один оператор if, фигурные скобки этой области else
опускаются в качестве исключения из этого руководства.
Я оставляю следующий код неаккуратным в качестве промежуточного шага, прежде чем показывать
его в лучшем виде. Ни один код не должен быть написан таким неаккуратным образом.
Ниже показано, как выглядит код после удаления фигурных скобок из
две другие области, содержащие только один оператор if:

.. code-block:: d

    if (existsCoffee)
    {
        writeln("Drink coffee at home");
    }
    else if (existsBicycle)
    {
        writeln("Ride to the good place");
    }
    else if (neighborIsHome)
    {
        writeln("Have coffee at neighbor's");
    }
    else
    {
        writeln("Walk to the bad place");
    }

Если мы теперь переместим эти операторы if в те же строки, что и заключающие их
предложения else, и приведем код в порядок, мы получим следующий более читаемый формат:

.. code-block:: d

    if (existsCoffee)
    {
        writeln("Drink coffee at home");
    }
    else if (existsBicycle)
    {
        writeln("Ride to the good place");
    }
    else if (neighborIsHome)
    {
        writeln("Have coffee at neighbor's");
    }
    else
    {
        writeln("Walk to the bad place");
    }



Удаление фигурных скобок позволяет сделать код более компактным и выровнять все
выражения для удобства чтения. Логические выражения, порядок
их вычисления и операции, которые выполняются, когда они имеют значение true , теперь легче увидеть с первого взгляда.
Эта распространенная программная конструкция называется цепочкой "if, else if, else".

Упражнения
-----------

Поскольку приведенное ниже логическое выражение истинно, мы ожидаем, что эта программа
выпьет лимонад и вымоет чашку:

.. code-block:: d

    import std.stdio;

    void main()
    {
        bool existsLemonade = true;
        if (existsLemonade)
        {
            writeln("Drinking lemonade");
            writeln("Washing the cup");
        }
        else
            writeln("Eating pie");
        writeln("Washing the plate");
    }

Но когда вы запустите эту программу, вы увидите, что она также моет тарелку:

* Пьет лимонад
* Моет чашку
* Моет тарелку

Почему? Корректируйте программу для мытья тарелки только в том случае, если логическое выражение
равно false .

Напишите программу, которая играет в игру с пользователем (очевидно, с доверием).
Пользователь бросает кубик и вводит его значение. Либо пользователь, либо программа выигрывают
в соответствии со значением кубика:


Значение матрицы
* 1 - Ты победил
* 2 - Ты победил
* 3 - Ты победил
* 4 - я выйграл
* 5 - я выйграл
* 6 - я выйграл
* Любое другое значение - ошибка недопустимое значение

Давайте изменим игру, попросив пользователя ввести значение от 1 до 1000. Теперь
пользователь выигрывает, когда значение находится в диапазоне 1-500, а компьютер выигрывает, когда
значение находится в диапазоне 501-1000. Можно ли легко изменить предыдущую программу, чтобы она работала таким образом?
Решения приведены на странице ().
